package object;

/**
 * Object
 * 是所有类的鼻祖，所有类直接或间接继承了Object，万物皆对象为了多态
 * Object中有两个经常被派生类重写的方法：toString()和equals()
 * 1)调用Object类的toString()时默认返回：类的全程@hashcode值，没有参考意义，所以常常重写toString（）
 * 来返回具体的属性值
 * 2）调用Object类的equals（）时默认比较的还是==（既比较地址），
 * 没有参考意义，所以常常重写equals（）来比较具体的属性值
 */
public class ObjectDemo {
    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = new String("hello");
        //String类重写了equals()来比较字符串内容相同
        System.out.println(s1.equals(s2));//true

        StringBuilder builder1 = new StringBuilder("hello");
        StringBuilder builder2 = new StringBuilder("hello");
        //StringBuilder类没有重写equals()，因此调用的还是Object类的equals()比较地址
        System.out.println(builder1.equals(builder2));//false

        //s1与builder1的类型不同，所以equals()一定是false
        System.out.println(s1.equals(builder1));//false














//        Point p1 = new Point(100,200);
//        Point p2 = new Point(100,200);
//        System.out.println(p1==p2);
//        System.out.println(p1.equals(p2));









        /*输出引用变量时默认会调用Object类的toString()方法
        该方法返回的字符串格式为: 类的全称@hashcode值
        但通常这个返回结果对我们的开发是没有意义的
        我们真正想输出的应该是对象的属性值
        我们认为Object类的toString()并不能满足需求
        因此我们常常需要重写toString()来返回具体的属性值
                */
//        Point p = new Point(100,200);
//        System.out.println(p);
//        System.out.println(p.toString());
//
//
//
//        Aoo o1 = new Aoo();
//        Object o2 = new Aoo();
//
//        Boo o3 = new Boo();
//        Object o4 = new Boo();
    }
}
class Aoo{

}
class Boo{

}
